```\newcommand{\commonfolder}{../../common-files}

\input{\commonfolder/header}
\input{\commonfolder/copyright}

\lhead{\bfseries SEED Labs -- The Mitnick Attack Lab}
\newcommand{\mitnickFigs}{./Figs}

\newcommand{\rsh}{\texttt{rsh}\xspace}

\begin{document}

\begin{center}
{\LARGE 《米特尼克攻击实验室》}
\end{center}

\seedlabcopyright{2020}


% *******************************************
% SECTION
% ******************************************* 
\section{概述}

Kevin Mitnick可能是美国最著名的黑客之一。他曾被列入FBI的通缉犯名单，当他在逃时，他开始对蜂窝电话网络产生兴趣，并需要特殊软件来帮助他实现这一目标。这使他找到了Tsutomu Shimomura，一位在圣地亚哥超级计算机中心工作的研究人员，他是蜂窝电话网络安全方面的领先研究者之一。Shimomura拥有Mitnick所需的代码。

1994年，Mitnick成功地对Shimomura的电脑进行了攻击，利用TCP协议中的漏洞以及Shimomura两台电脑之间的信任关系进行攻击。这次攻击引发了一场激烈的对决，并最终导致了Mitnick被捕。这场对决后来被写成书籍并搬上了大荧幕。这种攻击现在被称为“米特尼克攻击”，是一种特殊的TCP会话劫持。

本次实验的目的是重现经典的米特尼克攻击，让学生们亲身体验此类攻击。我们将模拟最初Shimomura电脑上的环境，并发动米特尼克攻击在两台Shimomura的电脑之间创建伪造的TCP会话。如果攻击成功，我们应能够在Shimomura的电脑上运行任何命令。本次实验涵盖以下主题：

\begin{itemize}[noitemsep]
    \item TCP会话劫持攻击
    \item TCP三次握手协议
    \item 米特尼克攻击
    \item 远程shell（\rsh）
    \item 数据包嗅探和欺骗
\end{itemize}

\paragraph{阅读资料和视频。}TCP会话劫持的详细内容可以参见以下章节：

\begin{itemize}
    \item 《SEED书》第16章，\seedbook
    \item 《SEED讲座》第6节，\seedisvideo
\end{itemize}

\paragraph{实验环境。} \seedenvironmentC


% *******************************************
% SECTION
% ******************************************* 
\section{米特尼克攻击的工作原理}

米特尼克攻击是一种特殊的TCP会话劫持攻击类型。它并不是劫持受害者A和B之间的现有TCP连接，而是首先在他们的名义下建立一个A到B的TCP连接，然后再自然地劫持该连接。

实际上，在这次米特尼克攻击中，主机A被称为X-Terminal，是目标。Mitnick希望登录X-Terminal并运行命令。主机B是一个受信任的服务器，允许无需密码即可登录X-Terminal。为了登录到X-Terminal，Mitnick需要冒充受信任的服务器，因此他不需要提供任何密码。图~\ref{tcp:mitnick}展示了攻击的大致过程。此攻击中有四个主要步骤。

\begin{figure}[htb]
    \centering
    \includegraphics[width=0.8\textwidth]{\mitnickFigs/mitnick_attack.pdf}
    \caption{米特尼克攻击的示例}
    \label{tcp:mitnick}
\end{figure}

\paragraph{步骤1：序列号预测。} 攻击前，Mitnick需要了解X-Terminal上的初始序列号（ISN）模式（在那些日子，ISN不是随机的）。Mitnick向X-Terminal发送SYN请求并收到SYN+ACK响应，然后他向X-Terminal发送RESET包以清除X-Terminal队列中的半开连接（以免队列被填满）。重复此过程二十次后，他发现两个连续TCP ISN之间存在模式。这使Mitnick能够预测序列号，这对于攻击至关重要。

\paragraph{步骤2：对受信任服务器进行SYN洪泛攻击。} 为了从受信任服务器向X-Terminal发送连接请求，Mitnick需要从受信任服务器发出一个SYN包到X-Terminal。X-Terminal会响应一个SYN+ACK包，并将其发回给受信任服务器。由于受信任服务器并未实际发起请求，它会向X-Terminal发送RESET包，要求X-Terminal停止三次握手。这种行为对米特尼克的攻击造成了麻烦。

为了解决这个问题，Mitnick需要在欺骗前先让受信任服务器保持沉默。因此，在进行欺骗前，他发动了SYN洪泛攻击来关闭这个服务器。当时的操作系统更加容易受到SYN洪泛攻击的影响。这次攻击实际上可以完全使受信任的计算机沉默下来。

\paragraph{步骤3：伪造一个TCP连接。} Mitnick希望使用\rsh（远程shell）在X-Terminal上运行后门命令；一旦设置了后门，他就可以登录到X-Terminal。要在X-Terminal上运行远程shell，Mitnick需要通过身份验证，即他在X-Terminal上有有效的帐户并且知道其密码。显然，他没有这个。

Shimomura经常需要从受信任的服务器登录到X-Terminal。为了避免每次都输入密码，他在X-Terminal上的.rhosts文件中添加了一些信息，因此当他从受信任的服务器登录时无需输入密码。这在那时是一个常见的做法。有了这种设置，在不输入任何密码的情况下，
Shimomura可以从受信任的服务器通过\rsh对X-Terminal运行命令，或者使用rlogin登录到X-Terminal。Mitnick想利用这个受信任的关系。

他需要首先创建一个受信任服务器和X-Terminal之间的TCP连接，然后在此连接中运行\rsh。他先发送了一个从受信任服务器的IP地址作为源IP地址的SYN请求给X-Terminal。X-Terminal随后向服务器发送了SYN+ACK响应。由于服务器已关闭，它不会发送RESET来断开连接。

为了完成三次握手协议，Mitnick需要伪造一个ACK包，该包必须确认X-TerminalSYN+ACK包中的序列号。不幸的是，
SYN+ACK响应仅发给了受信任服务器，并未发送给Mitnick，他无法看到序列号。然而，
由于之前的调查，Mitnick能够预测这个数字是什么，所以他成功地向X-Terminal发送了伪造的ACK响应来完成TCP三次握手。

\paragraph{步骤4：运行远程shell。} 使用在受信任服务器和X-Terminal之间建立的TCP连接，Mitnick可以向X-Terminal发送一个远程shell请求，要求它执行命令。使用此命令，Mitnick希望在X-Terminal上创建一个后门以随时无需重复攻击就可以获得shell访问。

他只需在X-Terminal上的.rhosts文件中添加
```\echo + + > .rhosts```\命令即可。
通过在X-Terminal上执行以下命令来实现这一点：\texttt{echo "seed seed touch /tmp/xyz" > .rhosts}。由于\rsh和rlogin程序使用.rhosts文件进行身份验证，因此添加此内容后，
X-Terminal将信任来自任何人的\rsh和rlogin请求。

% *******************************************
% SECTION
% ******************************************* 
\section{使用容器设置实验环境}

% -------------------------------------------
% SUBSECTION
% ------------------------------------------- 
\subsection{容器配置}

在本次实验中，我们需要三台机器，一台作为X-Terminal，另一台作为可信服务器，还有一台用于攻击的机器。在实际的米特尼克攻击中，攻击者的机器是一台远程计算机。在这次实验中，为了简化起见，我们将这三台机器放在同一个网络上。学生可以使用三个虚拟机进行此实验，但使用容器会更加方便。

实验环境如图~\ref{mitnick:fig:labsetup}所示。

\begin{figure}[htb]
    \centering
    \includegraphics[width=0.8\textwidth]{\commonfolder/Figs/Mitnick_onelan.pdf}
    \caption{实验环境配置}
    \label{mitnick:fig:labsetup}
\end{figure}

% -------------------------------------------
% SUBSECTION
% ------------------------------------------- 
\subsection{容器设置和命令}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\input{\commonfolder/container/setup}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

% -------------------------------------------
% SUBSECTION
% -------------------------------------------
\subsection{攻击者的容器介绍}

在本次实验中，我们可以使用虚拟机或攻击者容器作为攻击机器。如果你查看Docker Compose文件，你会发现攻击者的容器配置与其它容器不同。以下是这些差异：

\begin{itemize}
    \item \textbf{共享目录}：当我们使用攻击者的容器进行攻击时，需要将攻击代码放入攻击者的容器内。
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    \input{\commonfolder/container/volumes}
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

    \item \textbf{主机模式}：
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    \input{\commonfolder/container/host_mode}
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    
    \item \textbf{特权模式}：
    
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
    \input{\commonfolder/container/privileged_mode}
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\end{itemize}

% -------------------------------------------
% SUBSECTION
% ------------------------------------------- 
\subsection{安装\rsh程序（无需执行任何操作）}

远程shell\rsh是一个可以远程执行shell命令的命令行程序。虽然我们将在本次任务中使用rsh，但我们应该知道\rsh和rlogin程序不安全且不再被广泛使用。它们已被更安全的程序所取代，例如ssh。
因此，在现代Linux操作系统中，rsh命令实际上是一个到ssh程序的符号链接。

\begin{lstlisting}
$ ls -al /etc/alternatives | grep rsh
lrwxrwxrwx   1 root root    12 Jul 25  2017 rsh -> /usr/bin/ssh
\end{lstlisting}

为了重现米特尼克攻击，我们需要安装不安全版本的\rsh程序。显然，旧版的rsh已不再工作，但开源项目重实现了远程shell客户端和服务器端。它被称为rsh-redone。
我们可以使用以下命令来安装\rsh服务端和客户端。
注意：在容器镜像文件夹内的容器中已经安装了X-Terminal和可信服务器上的rsh程序（见容器的Dockerfile）。

\begin{lstlisting}
$ sudo apt-get install rsh-redone-client
$ sudo apt-get install rsh-redone-server
\end{lstlisting}

% -------------------------------------------
% SUBSECTION
% ------------------------------------------- 
\subsection{配置}

\rsh服务端程序使用两个文件进行身份验证，即.rhosts和/etc/hosts.equiv。每次服务器收到远程命令请求时都会检查/etc/hosts.equiv文件。如果请求来自存储在该文件中的主机名，则服务器无需询问密码即可接受。如果不存在或没有该主机名的/etc/hosts.equiv文件，则\rsh会检查用户家目录下的.rhosts文件。

Shimomura经常需要从可信服务器远程运行命令到X-Terminal，为了免去输入密码，他在主机X-Terminal上创建了一个.rhosts文件，并将可信服务器的IP地址放入其中。
请注意.rhosts文件必须位于用户的主目录顶层，并且只能由所有者/用户写入。

请使用以下命令在X-Terminal中设置.rhosts文件。值得注意的是，在进入容器时，我们将进入root帐户。在本实验中，我们需要切换到一个名为seed的普通用户账户（该帐户已在容器内创建）：

\begin{lstlisting}
# su seed          (切换到seed帐户)
$ cd               (前往seed的主目录)
$ touch .rhosts    (创建一个空文件)
$ echo [服务器IP地址] > .rhosts
$ chmod 644 .rhosts
\end{lstlisting}

要验证你的配置，请尝试在可信服务器上运行以下命令。

\begin{lstlisting}
# su seed          (切换到seed帐户)
$ rsh [X-Terminal的IP地址] date
\end{lstlisting}

如果该命令打印了当前日期和时间，那么你现在可以正常使用此配置。如果你看到"Authentication Failure"，你的设置可能有误。
一个常见的错误是.rhosts文件的权限：你需要确保它是仅可由所有者写的。

\paragraph{允许所有} 要允许用户从所有IP地址执行命令，只需在.rhosts文件中放入两个加号（“+ +”）。这非常危险，没有人应该这样做。但是如果你是一个攻击者，这是一个方便的方式来设置后门。正如我们之前提到的，在米特尼克攻击中这就是用的方法。

% *******************************************
% SECTION
% ******************************************* 
\section{任务1：模拟SYN洪泛}

当时操作系统的SYN洪泛攻击可以令目标机器失灵甚至关闭。然而，现代操作系统已不再容易受到这种伤害。我们将模拟这个效果。

我们可以手动停止可信服务器容器，但这还不足以解决问题。
当X-Terminal收到来自可信服务器的SYN包时，它会响应一个SYN+ACK包。在发送此包之前，
它需要知道可信服务器的MAC地址。首先检查ARP缓存。如果没有该条目，则X-Terminal将发送一个ARP请求包来获取MAC地址。
由于可信服务器已被关闭，没有人会对该请求作出回应，因此X-Terminal无法发出响应。结果是
TCP连接不会建立。

在实际攻击中，可信服务器的MAC地址实际上存在于X-Terminal的ARP缓存中。即使没有，我们也可以通过从可信服务器向X-Terminal发送一个伪造的ICMP回显请求来简单地获取可信服务器的MAC地址，并将其保存到缓存中。

为了简化任务，在停止可信服务器之前，我们将仅从X-Terminal ping一次它，然后使用`arp`命令检查并确保此条目已存在于缓存中。需要注意的是，
如果操作系统无法通过缓存的MAC地址到达某个目的地，则可能将删除缓存条目。
要使攻击简单化，你可以在root帐户下运行以下命令以永久添加一个ARP缓存条目（它需要）：

\begin{lstlisting}
# arp -s [服务器IP] [服务器MAC]
\end{lstlisting}

% *******************************************
% SECTION
% ******************************************* 
\section{任务2：伪造TCP连接和\rsh会话}
\label{sec:task2}

现在我们已经“关闭”了可信服务器，我们可以冒充受信任的服务器，并尝试在X-Terminal上启动一个\rsh会话。由于\rsh运行在TCP之上，因此我们需要首先建立一条从可信服务器到X-Terminal之间的TCP连接，然后在此TCP连接中运行\rsh。

米特尼克攻击的一个难点是预测TCP序列号。当时当TCP序列号未被随机化时这是可能的。然而，现代操作系统现在会随机化其TCP序列号（作为防止TCP会话劫持攻击的一种对策），因此预测数字变得不可行。
为了模拟原始米特尼克攻击的情况，我们允许学生嗅探数据包，
这样他们可以获取序列号而不是猜测它们。

\paragraph{限制。} 为了尽可能地模拟原始米特尼克攻击，尽管学生可以从X-Terminal嗅探TCP数据包，但他们不能使用捕获的数据包中的所有字段，因为在实际攻击中Mitnick无法嗅探数据包。当学生编写他们的攻击程序时，他们只能使用以下从捕获的包中提取的信息。
如果在攻击过程中使用其他字段将被扣分。

\begin{itemize}
    \item \textbf{TCP序列号字段}（不包括确认字段）。
    
    \item \textbf{TCP标志字段}。这使我们能够了解捕获的TCP数据包类型。在实际米特尼克攻击中，Mitnick确切地知道X-Terminal发送出哪些类型的包，因为它们是TCP三次握手协议的一部分。我们允许学生使用此字段以简化任务。
    
    \item \textbf{所有长度字段}，包括IP头长度、IP总长度和TCP头长度。这些信息对于攻击来说并不是必要的，在实际米特尼克攻击中Mitnick确切地知道它们的值。我们允许学生使用这些字段来简化任务。
\end{itemize}

\paragraph{\rsh的行为。} 要在可信服务器与X-Terminal之间建立伪造的\rsh会话，我们需要了解\rsh的行为。让我们从受信任服务器启动一个\rsh会话到X-Terminal，并使用Wireshark捕获两者之间的数据包（注意：我们将用Wireshark在攻击者的虚拟机上运行；确保选择了正确的网络接口以对应10.9.0.0/24网络）。
我们通过以下命令从主机A通过\rsh远程shell来运行Host B上的`date`命令。

\begin{lstlisting}
// 在受信任的服务器
$ rsh 10.9.0.5 date
\end{lstlisting}

以下是该\rsh会话中的数据包追踪。这里，`10.9.0.6`是可信服务器的IP地址，
而 `10.9.0.5` 是 X-Terminal 的 IP 地址。
如果数据包不携带任何TCP数据，则省略长度信息（即 Len=0 ）。

\begin{lstlisting}[caption={一个\rsh会话的数据包追踪},
                  label={listing:rsh}]
# 第一次连接
   SRC IP    DEST IP   TCP 头部
1  10.9.0.6  10.9.0.5  1023 -> 514 [SYN] Seq=778933536 
2  10.9.0.5  10.9.0.6  514 -> 1023 [SYN,ACK] Seq=10879102 Ack=778933537 
3  10.9.0.6  10.9.0.5  1023 -> 514 [ACK] Seq=778933537 Ack=10879103 
4  10.9.0.6  10.9.0.5  1023 -> 514 [ACK] Seq=778933537 Ack=10879103 Len=20
                       RSH会话建立
                       数据: 1022\x00seed\x00seed\x00date\x00
5  10.9.0.5  10.9.0.6  514 -> 1023 [ACK] Seq=10879103 Ack=778933557

# 第二次连接
6  10.9.0.5  10.9.0.6  1023 -> 1022 [SYN] Seq=3920611526 
7  10.9.0.6  10.9.0.5  1022 -> 1023 [SYN,ACK] Seq=3958269143 Ack=3920611527 
8  10.9.0.5  10.9.0.6  1023 -> 1022 [ACK] Seq=3920611527 Ack=3958269144 

# 回到第一次连接
9  10.9.0.5  10.9.0.6  514 -> 1023 [ACK] Seq=10879103 Ack=778933557 Len=1
                       数据: \x00
10 10.9.0.6  10.9.0.5  1023 -> 514 [ACK] Seq=778933557 Ack=10879104 
11 10.9.0.5  10.9.0.6  514 -> 1023 [ACK] Seq=10879104 Ack=778933557 Len=29
                       数据: Sun Feb 16 13:41:17 EST 2020
\end{lstlisting}

我们可以观察到一个\rsh会话由两个TCP连接组成。
第一个连接是由主机A（客户端）发起的。
B主机上的rshd进程在端口514监听连接请求。1至3号数据包执行的是三次握手协议。建立连接后，客户端将发送\rsh数据（包括用户ID和命令）到B主机（第4个数据包）。rshd进程会进行身份验证。
如果身份验证成功，则rshd将与客户端发起另一个独立的TCP连接。

第二个连接用于发送错误信息。
在上述追踪中，由于没有发生错误，因此该连接从未被使用过，
但必须成功建立，否则rshd不会继续。6至7号数据包执行的是第二个连接的三次握手协议。

在第二连接建立后
B主机将向客户端（通过第一个连接）发送零字节，
客户端会确认这个数据包。
随后，B上的rshd进程将会运行客户端发出的命令，并通过第一个连接将命令输出返回给客户端。学生可以使用Wireshark捕获一个\rsh会话并研究其行为，在发动米特尼克攻击前。

我们将攻击任务分成两个子任务，每个子任务专注于其中的一个连接。

% -------------------------------------------
% SUBSECTION
% ------------------------------------------- 
\subsection{任务2.1：伪造第一个TCP连接}
\label{sec:first-conn}

第一个TCP连接由攻击者通过伪造的SYN包发起。如图~\ref{fig:first-conn}所示，在X-Terminal接收到SYN包之后，它将回应一个SYN+ACK包给可信服务器。由于服务器已被关闭，不会重置此连接。
与之同网段的攻击者可以嗅探这个数据包并获取序列号。

\begin{figure}[htb]
    \centering
    \includegraphics[width=0.6\textwidth]{\mitnickFigs/mitnick-diagram-1.pdf}
    \caption{第一个连接}
    \label{fig:first-conn}
\end{figure}

\paragraph{步骤1：伪造SYN数据包。} 学生应编写一个程序来从可信服务器向X-Terminal发送伪造的SYN数据包（见Listing~\ref{listing:rsh}中的Packet 1）。TCP头标志字段中包含了六个标准位：
```
# 'U': URG位
# 'A': ACK位
# 'P': PSH位
# 'R': RST位
# 'S': SYN位
# 'F': FIN位

tcp = TCP()

# 设置SYN和ACK位
tcp.flags = "SA"

# 检查SYN和ACK是否是唯一被设置的位
if tcp.flags == "SA": 

# 检查SYN和ACK位是否设置
if 'S' in tcp.flags and 'A' in tcp.flags: 
```

需要注意的是，SYN数据包的源端口必须来自1023端口。如果使用了不同的端口，则在连接建立后rsh会重置该连接。
如果此步骤成功，我们从Wireshark可以看到一个SYN+ACK数据包从X-Terminal发出（见Listing~\ref{listing:rsh}中的Packet 2）。

\paragraph{步骤2：响应SYN+ACK数据包。}
在X-Terminal发送出SYN+ACK之后，受信任服务器需要向X-Terminal发送一个ACK数据包以完成三次握手协议。
该确认号应该为S+1，其中S是SYN+ACK数据包中包含的序列号。
见Listing~\ref{listing:rsh}中的Packet 3。

在实际米特尼克攻击过程中，攻击者看不到SYN+ACK数据包，因为它被发送到了受信任服务器而不是攻击者。这就是为什么Mitnick不得不猜测序列号的原因。
在这个实验中，我们允许学生通过嗅探来获取序列号。

学生们需要编写一个使用Scapy的嗅探和欺骗程序并运行它在攻击者的机器上。以下是一个可能有用的嗅探和欺骗程序框架，请确保遵循开始时所描述的限制，否则将会受到惩罚。

\begin{lstlisting}
#!/usr/bin/python3
from scapy.all import *

x_ip      = "10.9.0.5"  # X-Terminal
x_port    = 514         # X-Terminal 使用的端口号

srv_ip    = "10.9.0.6"  # 受信任服务器
srv_port  = 1023        # 可信服务器使用的端口

# 对于伪造数据包中的序列号加一操作
seq_num     = 0x1000 + 1


def spoof(pkt):
    global seq_num   # 我们将在函数中更新这个全局变量

    old_ip  = pkt[IP]
    old_tcp = pkt[TCP]

    # 打印调试信息
    tcp_len = old_ip.len - old_ip.ihl*4 - old_tcp.dataofs*4  # TCP数据长度
    print("{}:{} -> {}:{}  Flags={} Len={}".format(old_ip.src, old_tcp.sport,
                           old_ip.dst, old_tcp.dport, old_tcp.flags, tcp_len))



    # 构造响应的IP头部
    ip = IP(src=srv_ip, dst=x_ip)

    # 检查是否为SYN+ACK数据包；如果是，则伪造一个ACK数据包

    # ... 添加代码 ...

myFilter = 'tcp'   # 你需要使过滤器更加具体
sniff(iface='br-****', filter=myFilter, prn=spoof)
                 (*@\reflectbox{\ding{218}} \textbf{你必须在此处设置正确的值。}@*)
\end{lstlisting}

\paragraph{步骤3：伪造\rsh数据包。} 连接建立后，攻击者需要向X-Terminal发送\rsh数据。
\rsh数据的结构如下所示。

\begin{lstlisting}
[port number]\x00[uid_client]\x00[uid_server]\x00[your command]\x00
\end{lstlisting}

该数据由四个部分组成：一个端口号、客户端用户ID、服务器用户ID以及一个命令。端口号将用于第二次连接（参见任务2.2）。我们的容器中，客户端和服务器的用户ID都是`seed`。
字段之间以字节0分隔。请注意\rsh数据本身也以一个字节0结尾。示例如下，在这个例子中我们告诉X-Terminal我们将监听端口9090等待第二个连接，并且要运行的命令是`"touch /tmp/xyz"`。

\begin{lstlisting}
data = '9090\x00seed\x00seed\x00touch /tmp/xyz\x00'
send(IP()/TCP()/data, verbose=0)
\end{lstlisting}

学生们应修改第二步中编写的嗅探和欺骗程序，以向X-Terminal发送\rsh数据包（见Listing~\ref{listing:rsh}中的Packet 4）。如果此步骤成功，则从Wireshark我们可以看到X-Terminal将发起一个TCP连接到可信服务器的端口9090，该端口号在我们的rsh数据中指定。

请在报告中描述`touch`命令是否已在X-Terminal上执行。还应包括你的Wireshark截图。


% -------------------------------------------
% SUBSECTION
% ------------------------------------------- 
\subsection{任务2.2：伪造第二个TCP连接}
\label{sec:second-conn}

\begin{figure}[htb]
    \centering
    \includegraphics[width=0.6\textwidth]{\mitnickFigs/mitnick-diagram-2.pdf}
    \caption{第二次连接}
    \label{fig:second-conn}
\end{figure}

在第一个连接建立之后，X-Terminal将发起第二个连接。此连接由rshd用于发送错误信息。
在这个攻击中我们不会使用这个连接，但如果没有成功建立这个连接，则rshd将停止而不会执行我们的命令。
因此我们需要使用欺骗来帮助X-Terminal和受信任服务器完成该连接的建立。参见图~\ref{fig:second-conn}。

学生们需要编写另一个嗅探和欺骗程序，它监听可信服务器端口9090上的TCP流量（假设Task 2.1中使用了9090）。当看到SYN数据包时，它应该回应一个SYN+ACK数据包。见Listing~\ref{listing:rsh}中的Packet 7是一个例子。

如果两个连接都成功建立后，rshd将会执行包含在\rsh数据包中的命令。请检查/tmp文件夹并看看是否创建了/tmp/xyz文件，并且其时间戳与当前时间一致。请将你的证据包括在报告中。


% *******************************************
% SECTION
% ******************************************* 
\section{设置后门}

在任务2中，我们仅运行了一个`touch`命令来证明我们确实可以在X-Terminal上成功执行命令。如果我们想要多次执行更多的命令，则可以始终再次发动同样的攻击。这相当不方便。

Mitnick计划返回到X-Terminal。与其一次次地重新发动攻击，他在首次攻击后在X-Terminal中植入了一个后门。
这个后门允许他无需输入任何密码即可随时登录X-Terminal。要实现这一目标（如Section~\ref{subsec:configuration}所述），我们需要做的就是向.rhosts文件添加字符串`"+ +"`（在同一行）。我们可以将以下命令包含在我们的\rsh数据包中。

\begin{lstlisting}
echo "+ +" > .rhosts
\end{lstlisting}

学生们应该用上述的`touch`命令替换任务2中的`echo`命令，然后重新发动攻击。如果攻击成功，攻击者应能够通过下述命令远程登录X-Terminal而无需任何密码：

\begin{lstlisting}
$ rsh [X-Terminal's IP]
\end{lstlisting}

rsh程序可能未安装在攻击者的容器中，但你可以使用以下命令轻松地进行安装：
```
# apt-get update && apt-get -y install rsh-redone-client
```

% *******************************************
% SECTION
% ******************************************* 
\section{提交作业}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\input{\commonfolder/submission}
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%

\end{document}
```